from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.engine.reflection import Inspector
import csv
import os
import pymysql
import urllib.parse

#方案一
# 连接到 MySQL 数据库
# engine = create_engine('mysql+pymysql://root:crthwc721126@192.168.1.4:23307/intelligence-os')


# 数据库连接信息（确保将这里的占位符替换为实际的值）
db_user = 'root'
db_password = 'z@eersyOJEQ@8*0p'  # 假设密码中包含特殊字符 @
db_host = '192.168.1.4:13306'
db_name = 'decision-support-system'


#方案二
#密码有@导致连接出错。
# db_url = f'mysql+pymysql://{db_user}:{db_password}@{db_host}/{db_name}'
# engine = create_engine(db_url)

#方案三
# # 创建 pymysql 连接
# conn = pymysql.connect(
#     host=db_host,
#     user=db_user,
#     password=db_password,  # 直接传递密码，无需编码
#     database=db_name
#
# )
# # 使用 pymysql 连接创建 SQLAlchemy 引擎
# engine = create_engine('', creator=lambda: conn)

#方案四
db_password_encoded = urllib.parse.quote_plus(db_password)
db_url = f'mysql+pymysql://{db_user}:{db_password_encoded}@{db_host}/{db_name}'
engine = create_engine(db_url)





metadata = MetaData()
# 将 MetaData 与引擎关联（通过 reflect 方法）
# metadata.reflect(bind=engine)

# 生成txt文档
# with open('database_doc.txt', 'w') as f:
#     for table in metadata.tables.values():
#         f.write(f"Table: {table.name}\n")
#         f.write("Columns:\n")
#         for column in table.columns:
#             f.write(f"  {column.name} ({column.type})\n")
#         f.write("\n")


# 生成csv文档

# 指定保存 CSV 文件的文件夹
csv_folder = 'database/decision-support-system'  # 请替换为您想要保存 CSV 文件的实际文件夹路径

# 使用 Inspector 获取数据库架构信息
inspector = Inspector.from_engine(engine)

# 获取所有表名
table_names = inspector.get_table_names()

# 准备 CSV 文件的数据
csv_data = []

# 遍历所有表
# 遍历所有表
for table_name in table_names:
    csv_file_path = os.path.join(csv_folder, f'{table_name}.csv')
    columns = inspector.get_columns(table_name)

    # 获取主键约束信息（如果有的话）
    pk_constraint = inspector.get_pk_constraint(table_name)
    pk_columns = set(pk_constraint['constrained_columns']) if pk_constraint else set()

    # 准备 CSV 文件的数据
    csv_data = []

    # 遍历列信息，构建每行的数据
    for column in columns:
        is_primary_key = 'YES' if column['name'] in pk_columns else 'NO'
        row = [
            column['name'],  # 字段名
            column['type'],  # 数据类型
            'YES' if column['nullable'] else 'NO',  # 可否为空
            column.get('comment', ''),  # 注释（使用 get 方法避免 KeyError）
            is_primary_key,  # 是否主键
            column.get('default', ''),  # 默认取值（使用 get 方法避免 KeyError）
            # 这里可以添加处理其他约束的代码，比如 CHECK 约束（暂时留空）
            ''  # 约束
        ]
        csv_data.append(row)

    # 写入 CSV 文件
    with open(csv_file_path, 'w', newline='', encoding='utf-8') as csvfile:
        fieldnames = ['字段名', '数据类型', '可否为空', '注释', '是否主键', '默认取值', '约束']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

        writer.writeheader()
        for row in csv_data:
            writer.writerow(dict(zip(fieldnames, row)))

print("CSV 文件已生成并保存到指定文件夹。")